package lk.service.blogspringboot.interceptor;

import lk.service.blogspringboot.util.JWTUtil;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 我的全局请求拦截器
 */
public class MyRequestInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //Spring Security 认证或授权失败：
        //如果配置了 Spring Security，并且用户的认证或授权失败，可能会触发错误并重定向到 /error。
        String requestURI = request.getRequestURI();
        // 排除登录和注册请求的路径,都要进行token认证
        if (!"/login".equals(requestURI) &&!"/login/register".equals(requestURI)) {
            // 在这里进行其他请求的拦截处理逻辑
            String token = request.getHeader("Authorization");
            // 在请求处理之前进行的操作，例如验证 token、权限检查等
            if (token!= null && token.startsWith("Bearer")) {
                token = token.substring(7);   // 这里可能需要进一步处理获取到的 token，例如去掉 "Bearer " 前缀等
            }
            //// 后端处理   token 为null的情况     不在这里设置了   统一在Jwt的校验里面设置
            //if(token==null){
            //    response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            //    response.getWriter().write("您无权访问此资源");
            //    return false;
            //}
            boolean validateToken= JWTUtil.validateToken(token);
            // 返回 true 表示继续处理请求，返回 false 表示中断请求，可以通过 response 返回错误信息或进行其他处理

            return validateToken;// 这里返回的只是请求是否执行的标志，response才是返回到前端的内容
        }
        // 对于登录和注册请求，直接返回 true，不进行拦截
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 在控制器方法执行之后、视图渲染之前进行的操作
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 在整个请求完成后，即视图渲染之后进行的操作，例如资源清理等
    }
}
